// Loesung_von_Aufgabe_9.8_6_Zerfall_des_Neutrons_02

PVector baryonPosition = new PVector(0, 400); // Position des Neutrons bzw. Protons
PVector baryonGeschwindigkeit = new PVector(1, 0); // Geschwindigkeit des Neutrons bzw. Protons

float neutronZerfallsdauer = 5; // Die Zeit, die das Neutron zum Zerfallen braucht (in Sekunden ausgehend vom Programmstart)
boolean neutronZerfallen = false; // Boolean zum Speichern, ob das Neutron schon zerfallen ist

PVector elektronPosition; // Position des Elektrons
PVector elektronGeschwindigkeit; // Geschwindigkeit des Elektrons

PVector antineutrinoPosition; // Position des Antineutrinos
PVector antineutrinoGeschwindigkeit; // Geschwindigkeit des Antineutrinos

PVector magnetfeld = new PVector(0, 0, 0.003); // Die Richtung und Stärke des homogenen Magnetfeldes

void setup()
{
  size(800, 800);
}

void draw()
{
  background(150);

  // Ist das Neutron schon zerfallen?
  if (neutronZerfallen)
  {
    // Da das Proton geladen ist und sich in einem Magnetfeld befindet, wirkt die Lorentzkraft, welche hier vereinfacht berechnet wird
    PVector lorentzkraftProton = baryonGeschwindigkeit.cross(magnetfeld); // F = q * (v x B) mit q = 1
    baryonGeschwindigkeit.add(lorentzkraftProton); // Auf die Geschwindigkeit des Protons wird die Lorentzkraft addiert und das Proton somit abgelenkt
    baryonGeschwindigkeit.add(PVector.mult(baryonGeschwindigkeit, -0.001)); // Abstrahlungsverluste (qualitativ)

    // Die Lorentzkraft wirkt auch auf das Elektron, jedoch wird dieses viel stärker abgelenkt, da es eine kleinere Masse als das Proton hat
    PVector lorentzkraftElektron = elektronGeschwindigkeit.cross(magnetfeld);
    lorentzkraftElektron.mult(-10);
    elektronGeschwindigkeit.add(lorentzkraftElektron);
    elektronGeschwindigkeit.add(PVector.mult(elektronGeschwindigkeit, -0.001)); // Abstrahlungsverluste (qualitativ)

    // Da das Antineutrino ungeladen ist, wird es nicht abgelenkt

    baryonPosition.add(baryonGeschwindigkeit); // Das Proton weiter bewegen
    elektronPosition.add(elektronGeschwindigkeit); // Das Elektron weiter bewegen
    antineutrinoPosition.add(antineutrinoGeschwindigkeit); // Das Antineutrino weiter bewegen

    // Proton zeichnen
    noStroke();
    fill(255, 0, 0);
    ellipse(baryonPosition.x, baryonPosition.y, 15, 15);

    // Elektron zeichnen
    noStroke();
    fill(0, 0, 255);
    ellipse(elektronPosition.x, elektronPosition.y, 10, 10);

    // Antineutrino zeichnen
    noStroke();
    fill(0, 255, 0);
    ellipse(antineutrinoPosition.x, antineutrinoPosition.y, 5, 5);
  } else // Das Neutron ist noch nicht zerfallen
  {
    baryonPosition.add(baryonGeschwindigkeit); // Das Neutron weiter bewegen

    // Neutron zeichnen
    stroke(0);
    strokeWeight(1);
    fill(255, 255, 255);
    ellipse(baryonPosition.x, baryonPosition.y, 15, 15);

    // Prüfen, ob das Neutron jetzt zerfallen soll, falls die Zerfallsdauer überschritten wurde
    if (millis() / 1000.0 >= neutronZerfallsdauer)
    {
      neutronZerfallen = true; // Speichern, dass das Neutron zerfallen ist

      // .copy() bedeutet hier, eine Kopie der Position des Neutrons zu machen
      elektronPosition = baryonPosition.copy(); // Das ausgesendete Elektron an die Position des Neutrons setzten
      antineutrinoPosition = baryonPosition.copy(); // Das ausgesendete Antineutrino an die Position des Neutrons setzten

      elektronGeschwindigkeit = new PVector(random(-2, 2), random(-2, 2)); // Dem Elektron eine zufällige Geschwindigkeit geben
      antineutrinoGeschwindigkeit = new PVector(random(-2, 2), random(-2, 2)); // Dem Antineutrino eine zufällige Geschwindigkeit geben
    }
  }
}